GtkListBox: Style selectable rows differently
authorMatthias Clasen <mclasen@redhat.com>
Wed, 16 Jul 2014 03:13:43 +0000 (23:13 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 16 Jul 2014 03:56:47 +0000 (23:56 -0400)
We now apply the .button style class to rows that are either
activatable or selectable. Selectable rows only get the .button
if the listbox allows selection. This implies that we need to
update row styles when the selection mode changes, or when the
row gets added to a listbox.

gtk/gtklistbox.c

index b07898c77c71e142c8e4e182e69af99e7aa1c4d0..a679edba1acf161be4ae70f2146c87543171805c 100644 (file)
@@ -244,6 +244,9 @@ static void gtk_list_box_multipress_gesture_released (GtkGestureMultiPress *gest
                                                       gdouble               y,
                                                       GtkListBox           *box);
 
+static void gtk_list_box_update_row_styles (GtkListBox    *box);
+static void gtk_list_box_update_row_style  (GtkListBox    *box,
+                                            GtkListBoxRow *row);
 
 static GParamSpec *properties[LAST_PROPERTY] = { NULL, };
 static guint signals[LAST_SIGNAL] = { 0 };
@@ -974,6 +977,8 @@ gtk_list_box_set_selection_mode (GtkListBox       *box,
 
   priv->selection_mode = mode;
 
+  gtk_list_box_update_row_styles (box);
+
   g_object_notify_by_pspec (G_OBJECT (box), properties[PROP_SELECTION_MODE]);
 
   if (dirty)
@@ -2587,6 +2592,7 @@ gtk_list_box_insert (GtkListBox *box,
   if (ROW_PRIV (row)->visible)
     list_box_add_visible_rows (box, 1);
   gtk_list_box_apply_filter (box, row);
+  gtk_list_box_update_row_style (box, row);
   if (gtk_widget_get_visible (GTK_WIDGET (box)))
     {
       gtk_list_box_update_header (box, ROW_PRIV (row)->iter);
@@ -3229,17 +3235,40 @@ gtk_list_box_row_is_selected (GtkListBoxRow *row)
 }
 
 static void
-update_row_style (GtkListBoxRow *row)
+gtk_list_box_update_row_style (GtkListBox    *box,
+                               GtkListBoxRow *row)
 {
   GtkStyleContext *context;
+  gboolean can_select;
+
+  if (box && BOX_PRIV (box)->selection_mode != GTK_SELECTION_NONE)
+    can_select = TRUE;
+  else
+    can_select = FALSE;
 
   context = gtk_widget_get_style_context (GTK_WIDGET (row));
-  if (ROW_PRIV (row)->activatable)
+  if (ROW_PRIV (row)->activatable ||
+      (ROW_PRIV (row)->selectable && can_select))
     gtk_style_context_add_class (context, GTK_STYLE_CLASS_BUTTON);
   else
     gtk_style_context_remove_class (context, GTK_STYLE_CLASS_BUTTON);
 }
 
+static void
+gtk_list_box_update_row_styles (GtkListBox *box)
+{
+  GSequenceIter *iter;
+  GtkListBoxRow *row;
+
+  for (iter = g_sequence_get_begin_iter (BOX_PRIV (box)->children);
+       !g_sequence_iter_is_end (iter);
+       iter = g_sequence_iter_next (iter))
+    {
+      row = g_sequence_get (iter);
+      gtk_list_box_update_row_style (box, row);
+    }
+}
+
 /**
  * gtk_list_box_row_set_activatable:
  * @row: a #GTkListBoxrow
@@ -3261,7 +3290,7 @@ gtk_list_box_row_set_activatable (GtkListBoxRow *row,
     {
       ROW_PRIV (row)->activatable = activatable;
 
-      update_row_style (row);
+      gtk_list_box_update_row_style (gtk_list_box_row_get_box (row), row);
       g_object_notify (G_OBJECT (row), "activatable");
     }
 }
@@ -3309,7 +3338,7 @@ gtk_list_box_row_set_selectable (GtkListBoxRow *row,
  
       ROW_PRIV (row)->selectable = selectable;
 
-      update_row_style (row);
+      gtk_list_box_update_row_style (gtk_list_box_row_get_box (row), row);
       g_object_notify (G_OBJECT (row), "selectable");
     }
 }